-- 在items表中添加是否消耗品字段（如果不存在）
-- 使用整数类型：1表示消耗品，0表示非消耗品
ALTER TABLE items ADD COLUMN IF NOT EXISTS is_consumable INTEGER DEFAULT 0;

-- 为数据库中已有的记录设置默认值（将布尔值false转为0，true转为1）
UPDATE items SET is_consumable = 0 WHERE is_consumable IS NULL OR is_consumable = false;
UPDATE items SET is_consumable = 1 WHERE is_consumable = true;

-- 调整quantity字段，允许为空（因为只有消耗品才需要填写数量）
-- 先检查items表是否已经有quantity字段
-- 如果已存在，则修改其约束；如果不存在，则添加该字段
DO $$
BEGIN
    -- 检查quantity字段是否存在
    IF EXISTS (SELECT 1 FROM information_schema.columns 
               WHERE table_name = 'items' AND column_name = 'quantity') THEN
        -- 删除quantity字段上的非空约束（如果有）
        ALTER TABLE items ALTER COLUMN quantity DROP NOT NULL;
    ELSE
        -- 添加quantity字段
        ALTER TABLE items ADD COLUMN quantity INTEGER;
    END IF;
END $$;

-- 设置非消耗品的数量为1，消耗品如果数量为空则设为1
UPDATE items SET quantity = 1 WHERE quantity IS NULL OR (is_consumable = 0 AND quantity != 1);

-- 添加检查约束，确保消耗品的数量不能为NULL且必须大于0
ALTER TABLE items ADD CONSTRAINT check_consumable_quantity
    CHECK (is_consumable = 0 OR (is_consumable = 1 AND quantity IS NOT NULL AND quantity > 0));

-- 为新记录添加触发器，确保非消耗品的数量为1
CREATE OR REPLACE FUNCTION set_non_consumable_quantity()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.is_consumable = 0 THEN
        NEW.quantity = 1;
    ELSIF NEW.quantity IS NULL THEN
        NEW.quantity = 1;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tr_set_non_consumable_quantity ON items;
CREATE TRIGGER tr_set_non_consumable_quantity
BEFORE INSERT OR UPDATE ON items
FOR EACH ROW
EXECUTE FUNCTION set_non_consumable_quantity(); 